home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / emacs-complete / fsf / emacs / lwlib / xrdb-cpp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-09  |  5.2 KB  |  184 lines

  1. /* A general interface to the widgets of different toolkits.
  2.    Copyright (C) 1992, 1993 Lucid, Inc.
  3.  
  4. This file is part of the Lucid Widget Library.
  5.  
  6. The Lucid Widget Library is free software; you can redistribute it and/or 
  7. modify it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. The Lucid Widget Library is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU Emacs; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* This code reads a resource database file and filters it through cpp
  21.    with the same set of preprocessor defines that `xrdb' uses.
  22.    Call lwlib_xrdb_initialize(dpy) once, and then call the function
  23.    lwlib_GetFileDatabase() instead of XrmGetFileDatabase(), 
  24.    and lwlib_CombineFileDatabase() instead of XrmCombineFileDatabase().
  25.  */
  26.  
  27. #ifndef __STDC_EXTENDED__
  28. #define __STDC_EXTENDED__
  29. #endif
  30.  
  31. #include <stdio.h>
  32. #include <ctype.h>
  33. #include <X11/Xlib.h>
  34. #include <X11/Xos.h>
  35. #include <X11/Intrinsic.h>
  36. #include <X11/Xmu/SysUtil.h>
  37. #include <sys/stat.h>
  38.  
  39. extern char *index ();
  40.  
  41. static int
  42. file_p (path)
  43.      char *path;
  44. {
  45.   struct stat status;
  46.  
  47.   return (access (path, R_OK) == 0        /* exists and is readable */
  48.       && stat (path, &status) == 0        /* get the status */
  49.       && (status.st_mode & S_IFDIR) == 0);    /* not a directory */
  50. }
  51.  
  52. #ifndef CPP_PROGRAM
  53. #define CPP_PROGRAM "/lib/cpp"
  54. #endif
  55.  
  56. static char cpp_string [BUFSIZ];
  57. static char *cpp_file = 0;
  58.  
  59. #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
  60.  
  61. void
  62. lwlib_xrdb_initialize (display)
  63.      Display *display;
  64. {
  65.   Screen *screen;
  66.   Visual *visual;
  67.   char server [255];
  68.   char *colon, *s;
  69.  
  70. #define Push(str)  \
  71.   (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))
  72.  
  73. #define Print(str, thing)  \
  74.   (sprintf (s, str, thing), s = index (s, 0))
  75.  
  76.   s = cpp_string;
  77.   Push (CPP_PROGRAM);
  78.  
  79.   Push (" -DCLIENTHOST=");
  80.   XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
  81.   s = index (s, 0);
  82.   Push (" -DSERVERHOST=");
  83.   strcpy (s, XDisplayName (DisplayString (display)));
  84.   colon = index (s, ':');
  85.   if (colon == s)
  86.     {
  87.       XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
  88.       s = index (s, 0);
  89.     }
  90.   else if (colon)
  91.     s = colon;
  92.   else
  93.     s = index (s, 0);
  94.   
  95.   Print (" -DVERSION=%d", ProtocolVersion(display));
  96.   Print (" -DREVISION=%d", ProtocolRevision(display));
  97.   Print (" -DVENDOR=\"%s\"", ServerVendor(display));
  98.   Print (" -DRELEASE=%d", VendorRelease(display));
  99.   screen = DefaultScreenOfDisplay(display);
  100.   visual = DefaultVisualOfScreen(screen);
  101.   Print (" -DWIDTH=%d", screen->width);
  102.   Print (" -DHEIGHT=%d", screen->height);
  103.   Print (" -DX_RESOLUTION=%d", Resolution(screen->width,screen->mwidth));
  104.   Print (" -DY_RESOLUTION=%d", Resolution(screen->height,screen->mheight));
  105.   Print (" -DPLANES=%d", DisplayPlanes(display, DefaultScreen(display)));
  106.   Print (" -DBITS_PER_RGB=%d", visual->bits_per_rgb);
  107.   switch(visual->class) {
  108.   case StaticGray:    Print (" -DCLASS=%s", "StaticGray");    break;
  109.   case GrayScale:    Print (" -DCLASS=%s", "GrayScale");    break;
  110.   case StaticColor:    Print (" -DCLASS=%s", "StaticColor");
  111.             Print (" -DCOLOR", 0);             break;
  112.   case PseudoColor:    Print (" -DCLASS=%s", "PseudoColor");
  113.             Print (" -DCOLOR", 0);            break;
  114.   case TrueColor:    Print (" -DCLASS=%s", "TrueColor");
  115.             Print (" -DCOLOR", 0);            break;
  116.   case DirectColor:    Print (" -DCLASS=%s", "DirectColor");
  117.             Print (" -DCOLOR", 0);            break;
  118.   default:
  119.     fprintf (stderr, "unexpected visual class=%d\n", visual->class);
  120.     exit (-1);
  121.   }
  122.   *s++ = ' ';
  123.   *s = 0;
  124.   cpp_file = s;
  125. }
  126.  
  127. XrmDatabase
  128. lwlib_GetFileDatabase (path)
  129.      char *path;
  130. {
  131.   XrmDatabase db = 0;
  132.   char line [BUFSIZ];
  133.   char *s;
  134.   FILE *file;
  135.  
  136.   if (! file_p (path))
  137.     return 0;
  138.  
  139.   strcpy (cpp_file, path);
  140.   if (! (file = popen (cpp_string, "r")))
  141.     {
  142.       fprintf (stderr,
  143.            "couldn't execute %s; resource file %s file not munged.\n",
  144.            CPP_PROGRAM, path);
  145.       return XrmGetFileDatabase (path);
  146.     }
  147.   while (s = fgets (line, sizeof (line), file))
  148.     {
  149.       char ch, *tail;
  150.       if (*s == '!') continue;
  151.       for (; ((ch = *s) != '\n') && isspace(ch); s++);
  152.       if ((ch == '\0') || (ch == '\n') || (ch == '#')) continue;
  153.       tail = s + strlen (s);
  154.       if (tail - s < 3) continue;   /* this would be syntactically incorrect */
  155.       while (*(tail-1) == '\n' &&   /* handle \ at end of line */
  156.          *(tail-2) == '\\')
  157.     {
  158.       if (! fgets (tail, sizeof (line) - (tail - line), file))
  159.         continue;
  160.       tail += strlen (tail);
  161.     }
  162.       XrmPutLineResource (&db, s);
  163.     }
  164.   pclose (file);
  165.   return db;
  166. }
  167.  
  168. #ifdef THIS_IS_X11R5
  169.  
  170. int
  171. lwlib_CombineFileDatabase (path, target_db, override)
  172.      char *path;
  173.      XrmDatabase *target_db;
  174.      Bool override;
  175. {
  176.   XrmDatabase source_db = lwlib_GetFileDatabase (path);
  177.   if (! source_db)
  178.     return (! file_p (path));
  179.   XrmCombineDatabase (source_db, target_db, override);
  180.   return 1;
  181. }
  182.  
  183. #endif /* r5 */
  184.